#include "Protocol.hpp"
#include "TcpServer.hpp"
#include "ServerCalculator.hpp"

void Usage(const char *process)
{
    std::cout << "usage: \n\t";
    std::cout << process << " port[1024+]\n"
              << std::endl; // 输出内容最后可加一个\n换行，这样更美观
}

// ./server port
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        Usage(argv[0]);
        exit(0);
    }
    ServerCalculator scl;
    uint16_t port = std::stoi(argv[1]);
    TcpServer *tsvp = new TcpServer(port, std::bind(&ServerCalculator::Calculate, &scl, std::placeholders::_1));
    tsvp->Initial();
    daemon(0, 0); // 守护进程
    tsvp->Start();
    delete tsvp;

    // // 测试Request和Response的序列化和反序列化以及报头相关操作

    // Request req1(10, 20, '+');
    // std::string s;
    // req1.Serialize(&s);
    // std::cout << s << std::endl;
    // std::string en = Encapsulation(s);
    // std::cout << en << std::endl;
    // // std::cout<<en.size()<<std::endl;

    // std::cout << "*****************" << std::endl;
    // // std::cout<<en.size()<<std::endl;
    // s = "";
    // bool r = Decapsulation(en, &s);
    // std::cout << s << std::endl;
    // // std::cout<<"snow "<<r<<std::endl;
    // Request req2;
    // req2.Deserialize(s);
    // // std::cout << req2.data1_ << "\n" << req2.oper_ << "\n" << req2.data2_ << std::endl;
    // std::cout << req2.data1_ << req2.oper_ << req2.data2_ << std::endl;

    // std::cout << "############Response############" << std::endl;

    // Response resp1(30, 0);
    // std::string s2;
    // resp1.Serialize(&s2);
    // std::cout << s2 << std::endl;
    // std::string en2 = Encapsulation(s2);
    // std::cout << en2 << std::endl;

    // std::cout << "*****************" << std::endl;
    // s2 = "";
    // r = Decapsulation(en2, &s2);
    // std::cout << s2 << std::endl;
    // Response resp2;
    // resp2.Deserialize(s2);
    // std::cout << resp2.result_ << " " << resp2.code_ << std::endl;

    return 0;
}